// @ts-ignore
import {debounce} from 'uview-plus';

/**
 * 校验手机号
 * value 值
 * field 校验字段
 */
export const isValid = (
    value: string = "",
    field: string,
    toast: boolean = true
): boolean =>
    debounce(function () {
        let result: boolean = true;
        let title = "请输入";
        if (!value) return false
        if (field === "phone") {
            // 中国的手机号码通常以1开头，长度为11位
            const regex = /^1[3-9]\d{9}$/;
            result = regex.test(value);
            title = "请输入正确手机号";
        }
        if (field === "idCard") {
            // 正则表达式用于基本格式校验
            const regex = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
            if (!regex.test(value)) {
                result = false;
            }

            // 如果是18位身份证，需要进一步校验最后一位校验码
            if (value.length === 18) {
                const factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
                const checkCodes = [
                    "1",
                    "0",
                    "X",
                    "9",
                    "8",
                    "7",
                    "6",
                    "5",
                    "4",
                    "3",
                    "2",
                ];
                let sum = 0;

                for (let i = 0; i < 17; i++) {
                    sum += parseInt(value[i], 10) * factors[i];
                }

                // 计算校验码
                const checkCode = checkCodes[sum % 11];

                // 比较计算出的校验码与身份证最后一位
                result = checkCode.toUpperCase() === value[17].toUpperCase();
            }
            title = "请输入正确身份证号";
        }
        // 校验结果是假并且显示弹框
        if (!result && toast) {
            // @ts-ignore
            uni.$u.toast(title)
        }
        return result;
    }, 300);

// 浮点类型输入限制2位
// 限制只能输入两位小数  不要使用v-model  否则会导致 value 无法return到 input 中

export const doubleFixed = async (event: InputEvent, limit: number=2): Promise<string> => {
    return new Promise((resolve) => {
        nextTick(() => {
            // @ts-ignore
            let value = event.detail.value;
            // 移除非数字字符
            value = value.replace(/[^\d.]/g, '');
            // 只保留两位小数
            const parts = value.split('.');
            if (parts.length > 1 && parts[1].length > limit) {
                value = `${parts[0]}.${parts[1].substring(0, limit)}`;
            }
            resolve(value);
        });
    });
};
